const cheerio = require('cheerio');

/**
 * * 处理课程周次，将描述周次的文字处理为上课周次的数组
 * @param {string} str eg：'1-12周'  '1-4,7周'  '1-16双周'  '2-10单周'  '5,7,12周'  '1-5,7-9周'  '2-6,8-15双周'
 * @return {string[]} eg: ['1', '2', '3']
 */
function zc(str) {

  /**
   * 处理单双周
   * @param {string} str eg：'1-16双'
   * @param {string} text 需要去除的文字 单 | 双
   * @param {Boolean} double 是否是双周
   * @return {Array<string>} eg: ['1', '2', '3']
   */
  const DS = function(str, text, double) {
    str = str.replace(text, '');
    if (str.includes(',') && str.includes('-')) { return str.split(','); }
    else if (str.includes(',') && str.includes('-')) { return [ str ]; }
    const strat = Number(str.split('-')[0]);
    const end = Number(str.split('-')[1]);
    const need = [];
    for (let i = strat; i <= end; i++) {
      if (double) { // 双
        if (i % 2 === 0) { need.push(String(i)); }
      }
      else { // 单
        if (i % 2 !== 0) { need.push(String(i)); }
      }
    }
    return need;
  };


  /* 中文逗号、括号转为英文逗号、括号，去掉周字、去掉字符串中的空格、制表符、换行符等空白字符 */
  str = str.replace('(', '').replace('（', '').replace(')', '').replace('）', '').replace('周', '').replace('，', '').trim().replace(/\s/g, '');

  let need = [];
  str.split(',').forEach(s => {
    if (s.includes('单')) {
      need = [ ...need, ...DS(s, '单', false) ];
    }
    else if (s.includes('双')) {
      need = [ ...need, ...DS(s, '双', true) ];
    }
    else if (s.includes('-')) {
      const strat = Number(s.split('-')[0]);
      const end = Number(s.split('-')[1]);
      for (let i = strat; i <= end; i++) {
        need.push(String(i));
      }
    }
    else need.push(s);
  });
  return need;
}


/**
 * 将HTML中的表格转换为列表数据
 * @param {string} html - 包含表格的HTML字符串
 * @param {string} tableId - 表格元素ID
 * @param {string} defaultValue - 单元格内容补全时的默认值
 * @param {Function} cb - 单元格内容处理函数，不传默认取文本内容
 * @param {Number} onlyRow - 只取某一行，从0开始
 * @return {Array} - 转换后的二维列表数据
 */
function tableToList(html, tableId, defaultValue = '', cb, onlyRow) {
  try {
    const $ = cheerio.load(html);
    const table = $(tableId); // 获取表格元素
    // console.log('table', table);
    const dataList = []; // 初始化表格数组

    table.find('tr').each((rowIndex, e) => {
      if (onlyRow && rowIndex !== onlyRow) return true;

      $(e).find('td, th').each((colIndex, ee) => {
        const cell = $(ee);
        const colspan = Number(cell.attr('colspan')) || 1;
        const rowspan = Number(cell.attr('rowspan')) || 1;
        let value = cb ? cb(cell, rowIndex, colIndex, $) : cell.text().trim().replace(/\s/g, ''); // 获取单元格中内容

        for (let i = 0; i < colspan; i++) { // 处理colspan
          for (let j = 0; j < rowspan; j++) { // 处理rowspan
            const x = rowIndex + j;
            let y = colIndex + i;
            dataList[x] = dataList[x] || []; // 确保行存在
            while (dataList[x][y] !== undefined) { y++; } // 确保单元格在正确的位置
            dataList[x][y] = value;
            value = defaultValue;
          }
        }

      });

    });
    if (onlyRow) return dataList.filter(e => Boolean(e));
    return dataList;
  } catch (err) {
    throw err;
  }

}

module.exports = {
  zc,
  tableToList,
};
